# -*- coding: UTF-8 -*-
"""
@File    :   har_to_py.py
@Date    :   2022/12/16
@Author  :   Qiuye Lin
@License :   # Copyright (C) 2022, Qiuye Lin. All Rights Reserved.
@Desc    :   转换HAR文件为PYTHON文件
"""

import argparse
import json
from jinja2 import Environment, FileSystemLoader, Template

from config.path import DATA_DIR
from commons.logger import log


def convert_har_to_json(har_file_name: str):
    """
    读取HAR文件内容并转换为JSON对象处理
    ---------
    :param har_file_name: HAR的文件名称
    -------
    :return: 返回接口列表 List

    """

    with open(str(DATA_DIR) + "/har/" + har_file_name, "r", encoding="utf-8-sig") as f:
        # har文件内容传json
        har_data = json.load(f)
        print(har_data)
        entries = har_data.get("log", {}).get("entries")

        if not entries:
            raise ValueError("entries数据为空")

        # 过滤XHR类的接口
        # entries = list(
        #     filter(
        #         lambda x: True
        #         if x["_resourceType"].lower() == "xhr" else False, entries))

        entries = list(filter(lambda x: x.get("_resourceType", "").lower() == "xhr", entries))

        # 遍历接口信息
        api_list = []
        for req in entries:
            req_info = {}
            request_data = req.get("request")
            # 获取请求方式
            req_info["method"] = request_data.get("method").lower()
            if req_info["method"] == "get":
                # 获取URL
                req_info["url"] = request_data.get("url").split("?")[0]
            else:
                # 获取URL
                req_info["url"] = request_data.get("url")
            req_info["router"] = req_info["url"].split(".cn")[1]
            # 获取请求body
            req_info["body"] = get_body(request_data,
                                        req_info["method"].lower())
            req_info["body"] = convert_body_to_dict(req_info["body"])

            req_info["body"] = json.dumps(req_info["body"],
                                          ensure_ascii=False,
                                          indent=8)

            # 添加session_id参数
            body_str = list(req_info["body"])
            body_str.insert(1, "\n\t\t\"sessionId\": self.session_id,\t")
            body_str.insert(-1, "\t\t")
            req_info["body"] = ''.join(body_str)
            api_list.append(req_info)
        return api_list


def get_body(request_data: dict, method: str):
    """
    按请求方法区分获取请求体内容
    ---------
    :param request_data: HAR文件中, “request”字段的数据
    :param method: 请求方法 "get" "post"
    -------
    :return: 请求体，即body的键与值对列表

    """

    if method == "get":
        data = request_data.get("queryString", {})
    elif method == "post":
        data = request_data.get("postData", {}).get("params")
        if data is None:
            data = request_data.get("queryString", {})
    return data


def convert_body_to_dict(data: list):
    """
    将HAR文件中，原请求体的键值对列表信息转换为请求格式的字典
    ---------
    :param data: HAR文件中，请求体的键值对列表
    -------
    :return: 字典格式的请求体

    """

    request_data = {}
    for param in data:
        if param["name"] in [
                "v", "format", "source", "appKey", "timestamp", "sign", "locale",
                "sessionId"
        ]:
            continue
        request_data[param["name"]] = param["value"]
    return request_data


def convert_json_to_py(temp_file_name: str, api_info: list):
    """
    转换JSON对象为PYTHON文件
    ---------
    :param temp_file_name: 预期转换的模板文件名称
    :param api_info: 有HAR转换过来的JSON对象
    -------

    """
    # 设置模板加载器，指定模板文件所在的目录
    j2_loader = FileSystemLoader(str(DATA_DIR) + "/har/templates")

    # 创建模板环境
    env = Environment(loader=j2_loader)

    # 获取指定模板文件的模板对象
    j2_tmpl = env.get_template(temp_file_name)

    # 使用模板对象渲染JSON对象，生成Python代码
    content = j2_tmpl.render(api_info=api_info)

    # 将渲染后的Python代码写入文件
    with open('../test_data/current_common.py', 'w', encoding="utf-8") as fp:
        fp.write(content)


def main():
    # 创建一个参数解析器
    # parser = argparse.ArgumentParser("har_to_py.py -f [HAR file name]")
    parser = argparse.ArgumentParser(description="Convert HAR file to Python",
                                     usage="har_to_py.py -f [HAR file name]")
    # 添加一个命令行参数，用于指定 HAR 文件的名称
    parser.add_argument("-f",
                        "--file",
                        default="D:\work_tools\pycharm2023\glsk_test_dj\har\login.har",
                        required=True,
                        help="""
                        需要转化为python文件的HAR文件名称
                        文件必须先存放在har路径下
                        """,
                       type=str)
    # 解析命令行参数
    args = parser.parse_args()
    # 检查是否提供了文件名参数
    if args.file:
        # 如果文件名没有扩展名 ".har"，则添加它
        if ".har" not in args.file:
            har_file_name = args.file + ".har"
        else:
            har_file_name = args.file
        # 调用 convert_har_to_json 函数，将 HAR 文件转换为 JSON 格式
        requests_json = convert_har_to_json(har_file_name)
        # 调用 convert_json_to_py 函数，将 JSON 格式转换为 Python 文件
        convert_json_to_py("temp_common.j2", requests_json)


def main2(har_file_name):
        requests_json = convert_har_to_json(har_file_name)
        # 调用 convert_json_to_py 函数，将 JSON 格式转换为 Python 文件
        convert_json_to_py("temp_common.j2", requests_json)


if __name__ == "__main__":
    main2("record.har")
    # main2("login.har")

